﻿/************************************************************************************
 *      Copyright (C) 2015 yuwei,All Rights Reserved
 *      File:
 *                Program.cs
 *      Description:
 *            主程序入口，工厂模式相关演示示例
 *      Author:
 *                Yangxianwen
 *                
 *                
 *      Finish DateTime:
 *                2017年08月05日
 *      History:
 ***********************************************************************************/

using System;
using System.Configuration;
using System.Reflection;
using FactoryPattern.AbstractFactory.Abstract;
using FactoryPattern.Factory.Interface;
using FactoryPattern.Models;
using FactoryPattern.Simple;

namespace FactoryPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            {
                //var str2 = "abc";
                //var str3 = "a";
                //var str4 = "bc";
                //var str5 = str3 + str4;//https://zhidao.baidu.com/question/2014496313607692948.html
                //var str6 = "a" + "bc";
                //var str7 = new StringBuilder("abc").ToString();
                //var str1 = "abc";
                //var str8 = "abc"+"";

                //Console.WriteLine("str1 == str2 {0}", str1.Equals(str2));
                //Console.WriteLine("str1 == str2 {0}", ReferenceEquals(str1, str2));
                //Console.WriteLine("str1 == str5 {0}", ReferenceEquals(str1, str5));
                //Console.WriteLine("str1 == str6 {0}", ReferenceEquals(str1, str6));
                //Console.WriteLine("str1 == str7 {0}", ReferenceEquals(str1, str7));
                //Console.WriteLine("str1 == str8 {0}", ReferenceEquals(str1, str8));
                
                //Console.ReadKey();
            }

            {
                IGirlFriend american = new American();
                american.Eat();
            }
            Console.WriteLine("***********************************************************");
            {
                /***
                 * 优点：简单工厂模式能够根据外界给定的信息，决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力，有利于整个软件体系结构的优化。
                 * 缺点：很明显工厂类集中了所有实例的创建逻辑，容易违反GRASPR的高内聚的责任分配原则
                 */
                var gf = SimpleFactory.GetGirlFriend(Country.Chinese);
                gf.Eat();
            }
            Console.WriteLine("*********************工厂方法*******************************");
            {
                /***
                 * 优点：
                 *  子类提供挂钩。基类为工厂方法提供缺省实现，子类可以重写新的实现，也可以继承父类的实现。-- 加一层间接性，增加了灵活性
                 *  屏蔽产品类。产品类的实现如何变化，调用者都不需要关心，只需关心产品的接口，只要接口保持不变，系统中的上层模块就不会发生变化。
                 *  典型的解耦框架。高层模块只需要知道产品的抽象类，其他的实现类都不需要关心，符合迪米特法则，符合依赖倒置原则，符合里氏替换原则。
                 *  多态性：客户代码可以做到与特定应用无关，适用于任何实体类。
                 * 缺点：
                 *  需要Creator和相应的子类作为factory method的载体，如果应用模型确实需要creator和子类存在，则很好；否则的话，需要增加一个类层次。(不过说这个缺点好像有点吹毛求疵了)
                 * 
                 */
                var assemblyName = ConfigurationManager.AppSettings["assemblyName"];
                var assembly = Assembly.Load(assemblyName.Split(',')[0]);//获取dll
                var type = assembly.GetType(assemblyName.Split(',')[1]);//获取类型
                var factory = (IFactory)Activator.CreateInstance(type);//创建实例
                var gf = factory.GetGirlFriend();
                gf.Eat();
            }
            Console.WriteLine("*********************抽象工厂*******************************");
            {
                AbstactFamilyFactory chinaFamilyFactory = new ChinaFamilyFactory();
                AbstactFamilyFactory janpanFamilyFactory = new JanpanFamilyFactory();

                var chinaMan = chinaFamilyFactory.CreateMan();
                var chinaWoman = chinaFamilyFactory.CreateWoman();

                var janpanMan = janpanFamilyFactory.CreateMan();
                var janpanWoMan = janpanFamilyFactory.CreateWoman();

                chinaMan.PrintName();
                chinaWoman.SayHello();

                janpanMan.PrintName();
                janpanWoMan.SayHello();
            }

            Console.ReadKey();
        }
    }
}
